package att_java ;

import java.util.* ;

/**
 * Décrit une classe. Insérée dans une TDC (Table des Classe).
 */
public class INFO_CLASSE extends INFO {

	/**
	 * Classe dont la cette classe hérite.
	 */
	protected INFO_CLASSE parente ;
	
	/**
	 * Constructeur de cette classe (par de surdéfinition possible).
	 */
	protected INFO_METHODE constructeur ;
	
	/**
	 * TDA (Table des Attributs) contenant les attributs de cette classe.
	 */
	protected TDA tda ;
	
	/**
	 * TDM (Table des Methodes) contenant les méthodes de cette classe.
	 */
	protected TDM tdm ;
	
	protected int deplacement ;
	
	public INFO_CLASSE (String nom, int deplacement) {
		
		super(nom) ;
		
		this.parente = null ;
		this.constructeur = null ;
		
		this.tda = new TDA() ;
		this.tdm = new TDM() ;
		
		this.deplacement = deplacement ;
		
	}
	
	public INFO_CLASSE (String nom, int deplacement, INFO_CLASSE parente) {
		
		super(nom) ;
		
		this.parente = parente ;
		this.constructeur = null ;
		
		// Recopie de la table des attributs de la classe parente.
		this.tda = new TDA() ;
		this.tda.taille = parente.getTaille() ;
		this.tda.deplacement_suivant = parente.tda.getDeplacementSuivant() ;
		this.tda.table = (Vector<INFO_ATTRIBUT>)parente.tda.table.clone() ;
		
		// Recopie de la table des methodes de la classe parente.
		this.tdm = new TDM() ;
		this.tdm.taille = parente.getTailleTV() ;
		this.tdm.deplacement_suivant = parente.tdm.getDeplacementSuivant() ;
		this.tdm.table = (Vector<INFO_METHODE>)parente.tdm.table.clone() ;
		
		this.deplacement = deplacement ;
		
	}
	
	/**
	 * Retourne le constructeur de cette classe.
	 * 
	 * @return constructeur de cette classe.
	 */
	public INFO_METHODE getConstructeur ( ) {
		
		return this.constructeur ;
		
	}
	
	/**
	 * Definie le constructeur de cette classe.
	 * 
	 * @param constructeur Le constructeur de cette classe.
	 */
	public void setConstructeur (INFO_METHODE constructeur) {
		
		this.constructeur = constructeur ;
		
	}
	
	/**
	 * Retourne la TDA contenant les attributs de cette classe.
	 * 
	 * @return TDA contenant les attributs de cette classe.
	 */
	public TDA getTDA ( ) {
		
		return this.tda ;
		
	}
	
	/**
	 * Retourne la TDM contenant les méthodes de cette classe.
	 * 
	 * @return TDM contenant les attributs de cette classe.
	 */
	public TDM getTDM ( ) {
		
		return this.tdm ;
		
	}
	
	public int getTaille ( ) {
		
		return this.tda.getTaille() ;
		
	}
	
	public int getTailleTV ( ) {
		
		return this.tdm.getTaille() ;
		
	}
	
	public int getDeplacement ( ) {
		
		return this.deplacement ;
		
	}
	
	public String toString ( ) {
		
		return this.toString("") ;
		
	}
	
	public String toString (String prefix) {
		
		String text = prefix ;
		
		if (this.parente == null)
			text = text + "INFO_CLASSE:" + this.nom + "(taille:" + this.getTaille() + ", tailleTV:" + this.getTailleTV() + ", deplacement:" + this.deplacement + ")" + "\n" + this.getTDA().toString(prefix + "\t") + this.getTDM().toString(prefix + "\t") ;
		else
			text = text + "INFO_CLASSE:" + this.nom + "(taille:" + this.getTaille() + ", tailleTV:" + this.getTailleTV() + ", deplacement:" + this.deplacement + ")" + " (herite de " + this.parente.getNom() + ")" + "\n" + this.getTDA().toString(prefix + "\t") + this.getTDM().toString(prefix + "\t") ;
		
		return text ;
		
	}
	
}
